﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.Common;
using Sinacor.Infra.UI.Common;
using Sinacor.UI.Bovespa.Ordens.Model;
using System.ComponentModel;
using Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.Ordem;
namespace Sinacor.UI.Bovespa.Ordens.Communication.Translator
{
    public class TranslatorOrdemResponse : 
        BaseTranslator<Model.Ordem, OrdemResponse,  ModelCollection<Model.Ordem>, List<OrdemResponse>>
    {
        public override Sinacor.UI.Bovespa.Ordens.Model.Ordem Translate(OrdemResponse response)
        {


           
            Model.Ordem ordemModel = new Model.Ordem();

            ordemModel.ApelidoBroker = response.ApelidoBroker;
            ordemModel.ApelidoCliente = response.ApelidoCliente;
            ordemModel.Bolsa = response.Bolsa;

            ordemModel.Cambio = response.Cambio;
            ordemModel.CodigoBroker = response.CodigoBroker;
            ordemModel.CodigoCarteira = response.CodigoCarteira;
            ordemModel.CodigoCasamento = response.CodigoCasamento;
            ordemModel.CodigoCliente = response.CodigoCliente;
            ordemModel.CodigoISIN = response.CodigoISIN;
            ordemModel.CodigoNegocio = response.CodigoNegocio;
            ordemModel.CodigoUsuario = response.CodigoUsuario;
            ordemModel.CodigoUsuarioOrdem = response.CodigoUsuarioOrdem;
            ordemModel.ComplementoNomeCliente = response.ComplementoNomeCliente;

            if (response.DataOrdem.HasValue)
                ordemModel.DataOrdem = response.DataOrdem.Value;

            ordemModel.DataPregao = response.DataPregao;
            ordemModel.DataValidade = response.DataValidade;
            ordemModel.DigitoCliente = response.DigitoCliente;

            if (response.Discricionaria != null)
            {
                ordemModel.Discricionaria = (response.Discricionaria == 0 ? "N" : "S");
            }

            ordemModel.HoraOrdem = response.HoraOrdem;

            ordemModel.IndicadorChamadaLog = response.IndicadorChamadaLog;
            ordemModel.IndicadorDesprezaSaldo = response.IndicadorDesprezaSaldo;
            ordemModel.IndicadorDistribuicao = response.IndicadorDistribuicao;
            ordemModel.IndicadorOrdemAbertaAdminCon = response.IndicadorOrdemAbertaAdminCon;
            ordemModel.IndicadorOrdemFilaCasamento = response.IndicadorOrdemFilaCasamento;
            ordemModel.IndicadorPessoaVinculada = response.IndicadorPessoaVinculada;
            ordemModel.IndicadorTipoDistribuicao = response.IndicadorTipoDistribuicao;

            ordemModel.LoginOperador = response.LoginOperador;

            switch(response.NaturezaOperacao)
            {
                case Bovespa.Ordens.Ordem.TipoNaturezaOperacao.Compra:
                    ordemModel.NaturezaOperacao = Model.Enum.TipoNaturezaOperacao.Compra;
                    break;
                case Bovespa.Ordens.Ordem.TipoNaturezaOperacao.Venda:
                    ordemModel.NaturezaOperacao = Model.Enum.TipoNaturezaOperacao.Venda;
                    break;
                default:
                    ordemModel.NaturezaOperacao = Model.Enum.TipoNaturezaOperacao.Compra;
                    break;
            }

            ordemModel.NomeCliente = response.NomeCliente;
            ordemModel.NomeEmissorOrdem = response.NomeEmissorOrdem;
            ordemModel.NumeroOrdem = response.NumeroOrdem;
            ordemModel.NumeroOrdemOriginal = response.NumeroOrdemOriginal;

            if (response.NumeroOrdemSequencia.HasValue)
                ordemModel.NumeroOrdemSequencia = response.NumeroOrdemSequencia.Value;

            ordemModel.NumeroConjunto = response.NumeroConjunto;
            ordemModel.ObservacaoOrdem = response.ObservacaoOrdem;

            if (response.PercentualDigitado.HasValue)
                ordemModel.PercentualDigitado = response.PercentualDigitado.Value;

            ordemModel.PercentualReducaoAcrescimo = response.PercentualReducaoAcrescimo;

            if (response.PrazoTermo.HasValue)
                ordemModel.PrazoTermo = response.PrazoTermo.Value;

            ordemModel.Preco = response.Preco;
            ordemModel.PrecoMedio = response.PrecoMedio;

            ordemModel.Quantidade = response.Quantidade;
            ordemModel.QuantidadeAnexo4 = response.QuantidadeAnexo4;
            ordemModel.QuantidadeAnexo5 = response.QuantidadeAnexo5;
            ordemModel.QuantidadeCanceladaOferta = response.QuantidadeCanceladaOferta;
            ordemModel.QuantidadeCasada = response.QuantidadeCasada;

            if (response.QuantidadeDigitada.HasValue)
                ordemModel.QuantidadeDigitada = response.QuantidadeDigitada.Value;

            ordemModel.Saldo = response.Saldo;
            ordemModel.Situacao = response.Situacao;

            ordemModel.TaxaFinanciamento = response.TaxaFinanciamento;
            ordemModel.TipoFax = response.TipoFax;

            if (response.TipoMercado != null)
            {
                Model.Enum.TipoMercado enumTipoMercado; 
                new TranslatorEnumTipoMercado().TranslateEnum(response.TipoMercado, out enumTipoMercado);
                ordemModel.TipoMercado = enumTipoMercado; 
            }

            if (response.TipoOrdem != null && response.TipoOrdem.Count > 0)
            {
                ordemModel.TipoOrdem = new List<EnumWrapper<Sinacor.UI.Bovespa.Ordens.Model.Enum.TipoOrdem>>();
                Model.Enum.TipoOrdem? enumTipoOrdemTo;
                TranslatorEnumTipoOrdem TradutorEnum = new TranslatorEnumTipoOrdem();
                foreach (Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Cliente.Cliente.TipoOrdem? enumTipoOrdemFrom in response.TipoOrdem)
                {
                    TradutorEnum.TranslateEnum(enumTipoOrdemFrom, out enumTipoOrdemTo);
                    ordemModel.TipoOrdem.Add(enumTipoOrdemTo);
                }
            }

            ordemModel.Titulo = response.Titulo;

            ordemModel.ValorFinanciado = response.ValorFinanciado;
            ordemModel.ValorOrdem = response.ValorOrdem;
            ordemModel.VencimentoTermo = response.VencimentoTermo;

            return ordemModel;            
        }
    }
}
